package com.yachang.qym.usbhost.utils;

import com.esotericsoftware.minlog.Log;
import com.yachang.qym.usbhost.model.ContactModel;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by qinyuanmao on 16/1/6.
 */
public class SendData {

    public static boolean needSend = false;
    public static byte[] data = new byte[0];

    public static byte[] testNewData(){
        //0xA5,0x5A,0x00,0x03,0xEE,0x00,0x2F,0xC2
        byte data[] = { (byte) 0xA5, (byte) 0x5A, (byte) 0x00, (byte) 0x03, (byte) 0xEE, (byte) 0x00, (byte) 0x2F,(byte) 0xC2};
        return data;
    }

    public static List<byte[]> sendContactData(){
        List<byte[]> datas = new ArrayList<>();
        for(int i = 0; i < 128; i++){
            byte data[] = {(byte)0x84,(byte)0xA9,(byte)0x61,(byte)0x00,(byte)0x04,(byte)0x2F,(byte)0xE4,(byte)(0x00 + i),(byte)0x2F,(byte)0x00};
            data[9] = CRC8(data);
            datas.add(data);
        }
        return datas;
    }

    public static List<byte[]> sendRouteData(){
        List<byte[]> datas = new ArrayList<>();
        for(int i = 0; i < 128; i++) {
            byte data[] = {(byte) 0x84, (byte) 0xA9, (byte) 0x61, (byte) 0x00, (byte) 0x04, (byte) 0x2F, (byte) 0xF4, (byte) (0x00 + i), (byte) 0x2F, (byte)0x00};
            data[9] = (byte) CRC8(data);
            datas.add(data);
          
        }
        return datas;
    }

    public static byte[] sendNowRouteCaller(byte caller[]){
        byte[] data = {(byte) 0x84, (byte) 0xA9, (byte) 0x61, (byte) 0x00, (byte) 0x0B, (byte) 0x2F, (byte) 0x88, (byte) 0xF2, (byte) 0x01, (byte) 0x00, (byte) 0x04, caller[0], caller[1], caller[2], caller[3], (byte) 0x2F, (byte) 0x00};
        data[16] = (byte) CRC8(data);
        return data;
    }

    public static byte[] sendNowRoute() {
        byte[] data = {(byte) 0x84, (byte) 0xA9, (byte) 0x61, (byte) 0x00, (byte) 0x04, (byte) 0x2F, (byte) 0xCF, (byte) 0x00, (byte) 0x2F, (byte) 0xCB};
        return data;
    }

    public static List<byte[]> sendCalledData() {
        List<byte[]> datas = new ArrayList<>();
        for(int i = 0; i < 128; i++){
            byte[] data = {(byte) 0x84, (byte) 0xA9, (byte) 0x61, (byte) 0x00, (byte) 0x04, (byte) 0x2F, (byte) 0xE5, (byte) (0x00 + i), (byte) 0x2F, (byte)0x00};
            data[9] = (byte) CRC8(data);
            datas.add(data);
        }
        return datas;
    }

    public static byte[] sendCallAll(){
        byte[] data = {(byte) 0x84, (byte) 0xA9, (byte) 0x61, (byte) 0x00, (byte) 0x0F, (byte) 0x0F, (byte) 0x88, (byte) 0xF1, (byte) 0x02, (byte) 0x00, (byte) 0x07, (byte) 0x01, (byte) 0xCD, (byte) 0x01, (byte) 0xFF, (byte) 0x0A, (byte) 0xAA, (byte) 0xAA, (byte) 0xAA, (byte) 0x2F, (byte) 0xC1};
        return data;
    }

    public static byte[] sendContactCall(byte[] cid){
        //84 A9 61 00 0E 0F 88 F1 02 00 06 01 CD 01 00 85 86 09 2F 94
        byte[] data = {(byte) 0x84, (byte) 0xA9, (byte) 0x61, (byte) 0x00, (byte) 0x0E, (byte) 0x0F, (byte) 0x88, (byte) 0xF1, (byte) 0x02, (byte) 0x00, (byte) 0x06, (byte) 0x01, (byte) 0xCD, (byte) 0x01, (byte) 0x00 , (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x2F, (byte) 0x00};
        data[15] = cid[2];
        data[16] = cid[1];
        data[17] = cid[0];
        data[19] = (byte) CRC8(data);
        return data;
    }

    public static byte[] sendGroupCall(byte[] cid){
        //84 A9 61 00 0E 0F 88 F1 02 00 06 01 CD 01 00 85 86 09 2F 94
        byte[] data = {(byte) 0x84, (byte) 0xA9, (byte) 0x61, (byte) 0x00, (byte) 0x0F, (byte) 0x0F, (byte) 0x88, (byte) 0xF1, (byte) 0x02, (byte) 0x00, (byte) 0x07, (byte) 0x01, (byte) 0xCD, (byte) 0x01, (byte) 0x01 , (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x2F, (byte) 0x00};
        data[15] = cid[0];
        data[16] = cid[1];
        data[17] = cid[2];
        data[18] = cid[3];
        data[20] = (byte) CRC8(data);
        return data;
    }

    public static List<byte[]> sendAreaData() {
        List<byte[]> datas = new ArrayList<>();
        for(int i = 0; i < 16; i++){
            byte[] data = {(byte) 0x84, (byte) 0xA9, (byte) 0x61, (byte) 0x00, (byte) 0x04, (byte) 0x2F, (byte) 0xE0, (byte) (0x00 + i), (byte) 0x2F, (byte)0x00};
            data[9] = (byte) CRC8(data);
            datas.add(data);
        }
        return datas;
    }

    public static byte[] isFinishData(){
        byte[] data = {(byte) 0x84, (byte) 0xA9, (byte) 0x61, (byte) 0x00, (byte) 0x04, (byte) 0x2F, (byte) 0xFA, (byte) 0x01, (byte) 0x2F, (byte) 0xFF};
        return data;
    }

    public static List<byte[]> sendChangeArea() {
        List<byte[]> datas = new ArrayList<>();
        for(int i = 0; i < 8; i++){
            byte[] data = {(byte) 0x84, (byte) 0xA9, (byte) 0x61, (byte) 0x00, (byte) 0x07, (byte) 0x0F, (byte) 0x88, (byte) 0xF1, (byte) 0x03, (byte) 0x04, (byte) i, (byte) 0x2F, (byte)0x00};
            data[12] = (byte) CRC8(data);
            datas.add(data);
        }
        return datas;
    }

    public static byte[] sendMachineInfo() {
        byte[] data = { (byte) 0x84 ,(byte) 0xA9, (byte) 0x61, (byte) 0x00, (byte) 0x04, (byte) 0x2F, (byte) 0xF0, (byte) 0x00, (byte) 0x2F, (byte) 0xF4};
        return data;
    }

    public static byte[] sendHighPowerData() {
        byte[] data = {(byte) 0x84, (byte) 0xA9, (byte) 0x61, (byte) 0x00, (byte) 0x07, (byte) 0x0F, (byte) 0x88, (byte) 0xF1, (byte) 0x03, (byte) 0x05, (byte) 0x01, (byte) 0x2F, (byte) 0x59};
        return data;
    }

    public static byte[] sendLowPowerData() {
        byte[] data = {(byte) 0x84, (byte) 0xA9, (byte) 0x61, (byte) 0x00, (byte) 0x07, (byte) 0x0F, (byte) 0x88, (byte) 0xF1, (byte) 0x03, (byte) 0x05, (byte) 0x02, (byte) 0x2F, (byte) 0x5A};
        return data;
    }

    public static byte[] sendHighData() {
        byte[] data = {(byte) 0x84, (byte) 0xA9, (byte) 0x61, (byte) 0x00, (byte) 0x04, (byte) 0x2F, (byte) 0xCD, (byte) 0x00, (byte) 0x2F, (byte) 0xC9};
        return data;
    }

    public static byte[] sendEnterPoliceData(int mid) {
        //激活远端机08750601指令：0x84,0xA9,0x61,0x00,0x08,0x2F,0xCD,0x03,0x01,0x85,0x86,0x09,0x2F,0xCD
        byte[] data = {(byte) 0x84, (byte) 0xA9, (byte) 0x61, (byte) 0x00, (byte) 0x08, (byte) 0x2F, (byte) 0xCD,
                (byte) 0x03, (byte) 0x01, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x2F, (byte) 0x00 };
        byte[] byteMid = int2byte(mid);
        data[9] = byteMid[2];
        data[10] = byteMid[1];
        data[11] = byteMid[0];
        data[13] = CRC8(data);
        return data;
    }

    public static byte[] sendCancelPoliceData(int mid) {
        //取消远端机08750601指令：0x84,0xA9,0x61,0x00,0x08,0x2F,0xCD,0x03,0x00,0x85,0x86,0x09,0x2F,0xCC
        byte[] data = {(byte) 0x84, (byte) 0xA9, (byte) 0x61, (byte) 0x00, (byte) 0x08, (byte) 0x2F, (byte) 0xCD,
                (byte) 0x03, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x2F, (byte) 0x00 };
        byte[] byteMid = int2byte(mid);
        data[9] = byteMid[2];
        data[10] = byteMid[1];
        data[11] = byteMid[0];
        data[13] = CRC8(data);
        return data;
    }

    public static byte[] sendExitDeploy() {
        //84 A9 61 00 14 0F 88 F1 02 00 0C 01 CD 01 00 07 0F FF 00 00 01 01 2F D8 2F 8E
        byte[] data = {(byte) 0x84, (byte) 0xA9, (byte) 0x61, (byte) 0x00, (byte) 0x14, (byte) 0x0F, (byte) 0x88,
                (byte) 0xF1, (byte) 0x02, (byte) 0x00, (byte) 0x0C, (byte) 0x01, (byte) 0xCD, (byte) 0x01, (byte) 0x00,
                (byte) 0x07, (byte) 0x0F, (byte) 0xFF, (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x01, (byte) 0x2F, (byte) 0xD8, (byte) 0x2F, (byte) 0x8E};
        return data;
    }

    public static byte[] sendStopHelp(){
        //APP下发终止搜救（搜救方）0xA5,0x5A,0x00,0x05,0xDE,0x85,0x86,0x09,0x0D,0x0A
        byte[] data = {(byte) 0xA5, (byte) 0x5A, (byte) 0x00, (byte) 0x05, (byte) 0xDE, (byte) 0x85, (byte) 0x86, (byte) 0x09, (byte) 0x0D, (byte) 0x0A};
        return data;
    }

    public static byte[] sendFinishHelp(){
        //APP下发完成搜救（搜救方）0xA5,0x5A,0x00,0x05,0xDF,0x85,0x86,0x09,0x0D,0x0A
        byte[] data = {(byte) 0xA5, (byte) 0x5A, (byte) 0x00, (byte) 0x05, (byte) 0xDF, (byte) 0x85, (byte) 0x86, (byte) 0x09, (byte) 0x0D, (byte) 0x0A};
        return data;
    }

    public static byte[] sendMachineId() {
        byte[] data = {(byte) 0x84, (byte) 0xA9, (byte) 0x61, (byte) 0x00, (byte) 0x06, (byte) 0x2F, (byte) 0x88, (byte) 0xF1, (byte) 0x09, (byte) 0x01, (byte) 0x2F, (byte) 0x77};
        return data;
    }

    public static byte[] sendVoice(int voice){
        byte[] data = {(byte) 0xA5, (byte) 0x5A, (byte) 0x00, (byte) 0x03, (byte) 0x0F, (byte) (0x00 + voice), (byte) 0x2F, (byte) 0x00};
        byte byte7 = CRC8(data);
        data[7] = byte7;
        return data;
    }

    public static byte[] sendEnterDeveloper(){
        byte[] data = {(byte) 0xA5, (byte) 0x5A, (byte) 0x00, (byte) 0x03, (byte) 0xCA, (byte) 0x01, (byte) 0x2F, (byte) 0xE6};
        return data;
    }

    public static byte[] sendChangeEle(int ele){
        byte[] data = {(byte) 0xA5, (byte) 0x5A, (byte) 0x00, (byte) 0x03, (byte) 0xCC, (byte) (0x00 + ele), (byte) 0x2F, (byte) 0x00};
        byte byte7 = CRC8(data);
        data[7] = byte7;
        return data;
    }

    public static byte[] enterTestModel(){
        byte[] data = {(byte) 0xA5, (byte) 0x5A, (byte) 0x00, (byte) 0x03, (byte) 0xCA, (byte) 0xFF, (byte) 0x2F, (byte) 0xE6};
        return data;
    }

    public static byte[] exitTestModel(){
        byte[] data = {(byte) 0xA5, (byte) 0x5A, (byte) 0x00, (byte) 0x03, (byte) 0xCA, (byte) 0x00, (byte) 0x2F, (byte) 0xE6};
        return data;
    }

    public static byte[] enterNeedHelp(){
        byte[] data = {(byte) 0x84, (byte) 0xA9, (byte) 0x61, (byte) 0x00, (byte) 0x05, (byte) 0x2F, (byte) 0xCD, (byte) 0x02, (byte) 0x01, (byte) 0x2F, (byte) 0xCB};
        return data;
    }

    public static byte[] exitNeedHelp(){
        byte[] data = {(byte) 0x84, (byte) 0xA9, (byte) 0x61, (byte) 0x00, (byte) 0x05, (byte) 0x2F, (byte) 0xCD, (byte) 0x02, (byte) 0x00, (byte) 0x2F, (byte) 0xCA};
        return data;
    }

    public static byte[] enterHelper(int mid){
        //APP下发确认搜救0xA5,0x5A,0x00,0x05,0xDC,0x85,0x86,0x09,0x0D,0x0A
        byte[] data = {(byte) 0xA5, (byte) 0x5A, (byte) 0x00, (byte) 0x05, (byte) 0xDC, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x0D, (byte) 0x0A};
        byte[] byteMid = int2byte(mid);
        data[5] = byteMid[2];
        data[6] = byteMid[1];
        data[7] = byteMid[0];
        return data;
    }

    public static byte[] sendEnterDeploy(List<ContactModel> contactModels, int length) {
        byte[] data = new byte[17 + 4 * length];
        byte[] contactData = new byte[length * 4 + 1];
        int j = 0;
        for(int i = 0; i < contactModels.size(); i++){
            if(!contactModels.get(i).getIsWhere()){
                contactData[j] = contactModels.get(i).getCallID()[0];
                contactData[j + 1] = contactModels.get(i).getCallID()[1];
                contactData[j + 2] = contactModels.get(i).getCallID()[2];
                contactData[j + 3] = contactModels.get(i).getCallID()[3];
                j = j + 4;
            }
        }
        contactData[length * 4] = (byte) 0x2F;
        byte[] contentData = new byte[11 + length * 4];
        contentData[0] = (byte) 0x0F;
        contentData[1] = (byte) 0x88;
        contentData[2] = (byte) 0xF1;
        contentData[3] = (byte) 0x02;
        contentData[4] = (byte) 0x00;
        contentData[5] = (byte) (4 * length + 3);
        contentData[6] = (byte) 0x01;
        contentData[7] = (byte) 0xCD;
        contentData[8] = (byte) 0x01;
        contentData[9] = (byte) (length);
        for(int i = 0; i < contactData.length; i++){
            contentData[i + 10] = contactData[i];
        }
        data[0] = (byte) 0x84;
        data[1] = (byte) 0xA9;
        data[2] = (byte) 0x61;
        data[3] = (byte) 0x00;
        data[4] = (byte) (contentData.length);
        for(int i = 0; i < contentData.length; i++){
            data[i + 5] = contentData[i];
        }
        data[16 + 4 * length] = CRC8(data);
        String str = "";
        for(int i = 0; i < data.length; i++){
            int k = (int) data[i];
            if(k < 0){
                k += 256;
            }
            str = str + k +  " ";
        }
        return data;
    }


    public static byte CRC8(byte[] buffer) {
        int crci=0x00;
        for (int j = 3; j < buffer.length - 1; j++)
        {
            crci ^= buffer[j];
        }
        return (byte)crci;
    }

    public static byte[] int2byte(int res) {
        byte[] targets = new byte[3];

        targets[0] = (byte) (res & 0xff);// 最低位
        targets[1] = (byte) ((res >> 8) & 0xff);// 次低位
        targets[2] = (byte) ((res >> 16) & 0xff);// 次高位
        return targets;
    }
}
